from abc import abstractmethod

'''
定义了一种一对多的依赖关系，让多个观察者对象同时监听某一主题对象。
这个主题对象在状态发生变化时，会通知所有观察者对象，使它们能够自动更新自己
副总、项目经理发现老板进会议室时，负责通知做项目的员工,策划的员工做好。
'''


class Informer:
    def __init__(self):
        self.observers = []  # 保存所有观察者对象
        self.status = ''  # 老板状态

    def attach(self, student):
        self.observers.append(student)

    def notify(self):
        for p in self.observers:
            p.update()


# 通知者(副总)
class Monitor(Informer):
    pass


# 通知者(项目经理)
class Studyer(Informer):
    pass


class Students:
    def __init__(self, name, monitor):
        self.name = name
        self.monitor = monitor  # 绑定通知者

    @abstractmethod
    def update(self):
        pass


# 观察者(做项目的员工)
class StudentSleep(Students):

    def update(self):
        print('{},{}你是项目部门的,你们的项目做到什么程度了！'.format(self.monitor.status, self.name))


# 观察者(策划的员工)
class StudentGame(Students):

    def update(self):
        print('{},{}你是策划部门,你们的方案呢！'.format(self.monitor.status, self.name))


monitor = Monitor()
monitor.status = '老板来了！'
s1 = StudentSleep('小李', monitor)
s2 = StudentSleep('小徐', monitor)
monitor.attach(s1)
monitor.attach(s2)
monitor.notify()
stu = Studyer()
stu.status = '老板来了！'
s3 = StudentGame('小林', stu)
s4 = StudentGame('小吕', stu)
stu.attach(s3)
stu.attach(s4)
stu.notify()
'''
老板来了！,小李你是项目部门的,你们的项目做到什么程度了！
老板来了！,小徐你是项目部门的,你们的项目做到什么程度了！
老板来了！,小林你是策划部门,你们的方案呢！
老板来了！,小吕你是策划部门,你们的方案呢！
'''
